<?php

/**
 * Grupo Criar
 *
 * An open source application development framework for PHP 4.3.2 or newer
 *
 * @package Grupo Criar
 * @author Lucas Nunes Pinto Pinheiro
 * @copyright Keynet.com.br.
 * @since Version 1.0
 * @filesource
 */
// ------------------------------------------------------------------------

/**
 * Validation Nucleo Class
 *
 * @package Nucleo Criar
 * @subpackage	Libraries
 * @category	Validation
 * @author Lucas Nunes Pinto Pinheiro
 */
class CMS_Form_validation extends CI_Form_validation {

    //put your code here

    private $dias = 60;

    function __construct($rules = array()) {
        parent::__construct($rules);
        $this->CI->load->helper('data_hora');
        $this->CI->load->helper('strings');
    }

    /*function run($module = '', $group = '') {
        (is_object($module)) AND $this->CI = & $module;
        return parent::run($group);
    }*/

    public function set_dias($dias) {
        $this->dias = $dias;
    }

    // --------------------------------------------------------------------

    /**
     * Error String
     *
     * Returns the error messages as a string, wrapped in the error delimiters
     *
     * @access	public
     * @param	string
     * @param	string
     * @return	str
     */
    public function error_string_simples() {
        // No errrors, validation passes!
        if (count($this->_error_array) === 0) {
            return '';
        }

        // Generate the error string
        $str = '';
        foreach ($this->_error_array as $val) {
            if ($str != '') {
                $str .= "<br />";
            }
            if ($val != '') {
                $str .= $val;
            }
        }

        return $str;
    }

    /**
     *
     * @param String Nome da matriz
     * @return Array retorna um array dos campo que contem erros. 
     */
    function erros_campos_json($replace = null) {
        $dados = array();
        foreach ($this->_error_array as $k => $v) {
            if ($replace != null) {
                $k = str_replace(array($replace . '[', ']'), '', $k);
            }
            $dados[$k] = $k;
            $dados[$k . "_msg"] = $v;
        }
        return $dados;
    }

    /**
     *
     * @return String Mensagem padrão de erro. 
     */
    function msg_erros_campos_json() {
        return 'Os campos destacados em vermelho são de preenchimento obrigatório ou contém erros.';
    }

    /**
     *
     * @param String Data a ser validada
     * @return boolean TRUE data valida, FALSE data invalida
     */
    function data($data) {
        if (trim($data) != '') {
            $explode = explode('/', $data);
            $retorno = TRUE;
            switch ($explode[1]) {
                case 4:
                case 6:
                case 9:
                case 11:

                    if ($explode[1] > 30) {
                        $retorno = FALSE;
                    }

                    break;

                case 1:
                case 3:
                case 5:
                case 7:
                case 8:
                case 10:
                case 12:

                    if ($explode[1] > 31) {
                        $retorno = FALSE;
                    }

                    break;

                case 2:

                    if ($explode[1] > 28 && ($explode[2] % 4) != 0) {
                        $retorno = FALSE;
                    } else if ($explode[1] > 29 && ($explode[2] % 4) == 0) {
                        $retorno = FALSE;
                    }

                    break;
            }
            return $retorno;
        } else {
            return TRUE;
        }
    }

    /**
     *
     * @param String Hora a ser validada
     * @return boolean TRUE hora valida, FALSE hora invalida
     */
    function hora($hora) {
        if (trim($hora) != '') {
            $explode = explode(':', $hora);
            $explode[0] = (!isset($explode[0]) ? 0 : (int) $explode[0]);
            $explode[1] = (!isset($explode[1]) ? 1 : (int) $explode[1]);
            $explode[2] = (!isset($explode[2]) ? 2 : (int) $explode[2]);

            if ($explode[0] >= 0 AND $explode[0] <= 23) {
                if ($explode[1] >= 0 AND $explode[1] <= 59) {
                    if ($explode[2] >= 0 AND $explode[2] <= 59) {
                        return TRUE;
                    } else {
                        return FALSE;
                    }
                } else {
                    return FALSE;
                }
            } else {
                return FALSE;
            }
        } else {
            return TRUE;
        }
    }

    /**
     *
     * @param String Data_hora a ser validada
     * @return boolean TRUE data_hora valida, FALSE data_hora invalida
     */
    function data_hora($data_hora) {
        if (trim($data_hora) != '') {
            $explode = explode(' ', $data_hora);
            $data = (!isset($explode[0]) ? null : $explode[0]);
            $hora = (!isset($explode[1]) ? null : $explode[1]);
            if ($data != null && $hora != null) {
                if ($this->data($data) == TRUE && $this->hora($hora) == TRUE) {
                    return TRUE;
                } else {
                    return FALSE;
                }
            } else {
                return FALSE;
            }
        } else {
            return TRUE;
        }
    }

    /**
     *
     * @param String Placa a ser validada
     * @return boolean TRUE placa valida, FALSE placa invalida
     */
    function placa($placa) {
        if (trim($placa) != '') {
            if (validaString(array('entrada' => $placa, 'formato' => 'placa')) == TRUE) {
                return TRUE;
            } else {
                return FALSE;
            }
        } else {
            return TRUE;
        }
    }

    /**
     *
     * @param String CNPJ a ser validada
     * @return boolean TRUE cnpj valida, FALSE cnpj invalida
     */
    function cnpj($cnpj) {
        if (trim($cnpj) != '') {
            if (validaString(array('entrada' => $cnpj, 'formato' => 'cnpj')) == TRUE) {
                return TRUE;
            } else {
                return FALSE;
            }
        } else {
            return TRUE;
        }
    }

    /**
     *
     * @param String CPF a ser validada
     * @return boolean TRUE cpf valida, FALSE cpf invalida
     */
    function cpf($cpf) {
        if (trim($cpf) != '') {
            if (validaString(array('entrada' => $cpf, 'formato' => 'cpf')) == TRUE) {
                return TRUE;
            } else {
                return FALSE;
            }
        } else {
            return TRUE;
        }
    }

    /**
     *
     * @param String CPF_CNPJ a ser validada
     * @return boolean TRUE cpf_cnpj valida, FALSE cpf_cnpj invalida
     */
    function cpf_cnpj($cpf_cnpj) {
        if (trim($cpf_cnpj) != '') {
            $cpf_cnpj = limpaString(array('entrada' => $cpf_cnpj));
            if (strlen($cpf_cnpj) == 11) {
                return $this->cpf($cpf_cnpj);
            } else if (strlen($cpf_cnpj) == 14) {
                return $this->cnpj($cpf_cnpj);
            } else {
                return FALSE;
            }
        } else {
            return TRUE;
        }
    }

    /**
     *
     * @param String Registro a ser validada
     * @return boolean TRUE registro valida, FALSE registro invalida
     */
    function registro($registro) {
        if (trim($registro) != '') {
            if (validaString(array('entrada' => $registro, 'formato' => 'registro')) == TRUE) {
                return TRUE;
            } else {
                return FALSE;
            }
        } else {
            return TRUE;
        }
    }

    /**
     *
     * @param String CNH a ser validada
     * @return boolean TRUE cnh valida, FALSE cnh invalida
     */
    function cnh($cnh) {
        if (trim($cnh) != '') {
            // Canonicalize input
            $cnh = limpaString(array('entrada' => $cnh));

            // Validate length and invalid numbers
            if ((strlen($cnh) != 11) || (intval($cnh) == 0)) {
                return FALSE;
            }

            // Validate check digits using a modulus 11 algorithm
            for ($c = $s1 = $s2 = 0, $p = 9; $c < 9; $c++, $p--) {
                $s1 += intval($cnh[$c]) * $p;
                $s2 += intval($cnh[$c]) * (10 - $p);
            }

            if ($cnh[9] != (($dv1 = $s1 % 11) > 9) ? 0 : $dv1) {
                return FALSE;
            }

            if ($cnh[10] != (((($dv2 = ($s2 % 11) - (($dv1 > 9) ? 2 : 0)) < 0) ? $dv2 + 11 : $dv2) > 9) ? 0 : $dv2) {
                return FALSE;
            }
            return TRUE;
        } else {
            return TRUE;
        }
    }

    /**
     *
     * @param String Dominio a ser validada
     * @return boolean TRUE dominio valida, FALSE dominio invalida
     */
    function valid_dominio($dominio) {
        if (trim($dominio) != '') {
            $a_dominios = array('AGR', 'AM', 'ART', 'EDU', 'COM', 'COOP', 'ESP', 'FAR', 'FM', 'G12', 'GOV', 'IMB', 'IND', 'INF', 'MIL', 'NET', 'ORG', 'PSI', 'REC', 'SRV', 'TMP', 'TUR', 'TV', 'ETC', 'ADM', 'ADV', 'ARQ', 'ATO', 'BIO', 'BMD', 'CIM', 'CNG', 'CNT', 'ECN', 'ENG', 'ETI', 'FND', 'FOT', 'FST', 'GGF', 'JOR', 'LEL', 'MAT', 'MED', 'MUS', 'NOT', 'NTR', 'ODO', 'PPG', 'PRO', 'PSC', 'QSL', 'SLG', 'TRD', 'VET', 'ZLG', 'BLOG', 'FLOG', 'NOM', 'VLOG', 'WIKI', 'XXX');

            $dominio_explode_barra = explode('/', $dominio);
            $valida_dominio = array();
            if (count($dominio_explode_barra) > 0) {
                foreach ($dominio_explode_barra as $v) {
                    if ($v != '' || $v != null) {
                        $dominio_explode_ponto = explode('.', $v);
                        if (count($dominio_explode_ponto) > 0) {
                            foreach ($dominio_explode_ponto as $v2) {
                                $valida_dominio[] = $v2;
                            }
                        } else {
                            $valida_dominio[] = $v;
                        }
                    }
                }
            }

            $retorno = FALSE;

            foreach ($valida_dominio as $v3) {
                if (in_array(strtoupper($v3), $a_dominios) === TRUE) {
                    $retorno = TRUE;
                }
            }

            return $retorno;
        } else {
            return TRUE;
        }
    }

    /**
     *
     * @param String Data1 a ser validada
     * @param String Data2 a ser validada
     * @return boolean TRUE data valida, FALSE data invalida
     */
    function data_maior($data_1, $data_2) {
        if (trim($data_1) != '') {
            $data_2 = $this->CI->input->post($data_2);

            if ($this->data($data_1) == TRUE AND $this->data($data_2) == TRUE) {
                $data_1 = formatarData($data_1, array('formato' => 'Ymd'));
                $data_2 = formatarData($data_2, array('formato' => 'Ymd'));
                if ($data_1 > $data_2) {
                    return TRUE;
                } else {
                    return FALSE;
                }
            }
        } else {
            return TRUE;
        }
    }

    /**
     *
     * @param String Data1 a ser validada
     * @param String Data2 a ser validada
     * @return boolean TRUE data valida, FALSE data invalida
     */
    function data_igual_maior($data_1, $data_2) {
        if (trim($data_1) != '') {
            $data_2 = $this->CI->input->post($data_2);

            if ($this->data($data_1) == TRUE AND $this->data($data_2) == TRUE) {
                $data_1 = formatarData($data_1, array('formato' => 'Ymd'));
                $data_2 = formatarData($data_2, array('formato' => 'Ymd'));
                if ($data_1 >= $data_2) {
                    return TRUE;
                } else {
                    return FALSE;
                }
            } else {
                return FALSE;
            }
        } else {
            return TRUE;
        }
    }

    /**
     *
     * @param String Data1 a ser validada
     * @param String Data2 a ser validada
     * @param Int Dias a ser validada
     * @return boolean TRUE data valida, FALSE data invalida
     */
    function data_maior_dias($data_1, $data_2) {
        if (trim($data_1) != '') {
            $data_2 = $this->CI->input->post($data_2);

            if ($this->data($data_1) == TRUE AND $this->data($data_2) == TRUE) {
                $diferenca = formatarData($data_2, array('formato' => 'diferenca', 'data' => $data_1));
                if ($diferenca <= $this->dias) {
                    return TRUE;
                } else {
                    return FALSE;
                }
            } else {
                return FALSE;
            }
        } else {
            return TRUE;
        }
    }

    /**
     *
     * @param String Data1 a ser validada
     * @param String Data2 a ser validada
     * @return boolean TRUE data valida, FALSE data invalida
     */
    function data_hora_maior($data_1, $data_2) {
        if (trim($data_1) != '') {
            $data_2 = $this->CI->input->post($data_2);

            if ($this->data_hora($data_1) == TRUE AND $this->data_hora($data_2) == TRUE) {
                $data_1 = formatarData($data_1, array('formato' => 'YmdHis'));
                $data_2 = formatarData($data_2, array('formato' => 'YmdHis'));
                if ($data_1 > $data_2) {
                    return TRUE;
                } else {
                    return FALSE;
                }
            } else {
                return FALSE;
            }
        } else {
            return TRUE;
        }
    }

    /**
     *
     * @param String Data1 a ser validada
     * @param String Data2 a ser validada
     * @return boolean TRUE data valida, FALSE data invalida
     */
    function data_hora_igual_maior($data_1, $data_2) {
        if (trim($data_1) != '') {
            $data_2 = $this->CI->input->post($data_2);

            if ($this->data_hora($data_1) == TRUE AND $this->data_hora($data_2) == TRUE) {
                $data_1 = formatarData($data_1, array('formato' => 'YmdHis'));
                $data_2 = formatarData($data_2, array('formato' => 'YmdHis'));
                if ($data_1 >= $data_2) {
                    return TRUE;
                } else {
                    return FALSE;
                }
            } else {
                return FALSE;
            }
        } else {
            return TRUE;
        }
    }

    /**
     *
     * @param String Data1 a ser validada
     * @param String Data2 a ser validada
     * @return boolean TRUE data valida, FALSE data invalida
     */
    function hora_maior($hora_1, $hora_2) {
        if (trim($hora_1) != '') {
            $hora_2 = $this->CI->input->post($hora_2);

            if ($this->hora($hora_1) == TRUE AND $this->hora($hora_2) == TRUE) {
                $hora_1 = formatarData($hora_1, array('formato' => 'His'));
                $hora_2 = formatarData($hora_2, array('formato' => 'His'));

                if ($hora_1 > $hora_2) {
                    return TRUE;
                } else {
                    return FALSE;
                }
            } else {
                return FALSE;
            }
        } else {
            return TRUE;
        }
    }

    /**
     *
     * @param Array Matriz a setar null em campos vazio
     * @return Array A matriz formatada 
     */
    function set_null_campos($dados = array()) {
        $novos_dados = array();
        foreach ($dados as $k => $v) {
            if (!is_array($v)) {
                if (trim($v) != '') {
                    $novos_dados[$k] = trim($v);
                } else {
                    $novos_dados[$k] = null;
                }
            } else {
                $novos_dados[$k] = $this->set_null_campos($v);
            }
        }
        return $novos_dados;
    }

    /**
     *
     * @param String Numero1 a ser validada
     * @param String Numero2 a ser validada
     * @return boolean TRUE data valida, FALSE data invalida
     */
    function numero_igual_menor($numero_1, $numero_2) {
        if (trim($numero_1) != '' OR trim($numero_2) != '') {
            if (is_numeric($numero_1) AND is_numeric($numero_2)) {
                if (((int) $numero_1) <= ((int) $numero_2)) {
                    return TRUE;
                } else {
                    return FALSE;
                }
            } else {
                return FALSE;
            }
        } else {
            return TRUE;
        }
    }

    /**
     *
     * @param String Username a ser validada
     * @return boolean TRUE username valida, FALSE username invalida
     */
    function valid_user_nucleo($username) {
        $expressao = '/^[a-zA-Z0-9_\.\-]+@[a-zA-Z_\.\-]+$/';
        if (preg_match($expressao, $username)) {
            $explode_username = explode('@', $username);
            $ci = & get_instance();
            $ci->load->model('dominios/dominios_model');
            $params = array();
            $params['AND']['dominio'] = '@' . $explode_username[1];
            $b_consulta = $ci->dominios_model->consultar($params);
            if ($b_consulta == null) {
                return FALSE;
            } else {
                return TRUE;
            }
        } else {
            return FALSE;
        }
    }

    /**
     *
     * @param Array Username a ser validada
     * @return boolean TRUE username valida, FALSE username invalida
     */
    function valid_user_nucleo_all($usernames = array()) {
        $explode_usernames = explode(',', $usernames);
        $conta_erro = 0;
        if (count($explode_usernames) > 0) {
            $ci = & get_instance();
            $ci->load->model('usuarios/usuarios_nucleo_model', '', TRUE);
            foreach ($explode_usernames as $v) {
                $b_consulta = $ci->usuarios_nucleo_model->con_usuarios('US.id_usuarios', array(' AND US.id_usuarios = ' => $v));
                if ($b_consulta == null) {
                    $conta_erro++;
                }
            }
        }

        if ($conta_erro > 0) {
            return FALSE;
        } else {
            return TRUE;
        }
    }

    /**
     *
     * @param Array Grupos a ser validada
     * @return boolean TRUE grupos valida, FALSE grupos invalida
     */
    function valid_grupos_nucleo_all($grupos = array()) {
        $explode_grupos = explode(',', $grupos);
        $conta_erro = 0;
        if (count($explode_grupos) > 0) {
            $ci = & get_instance();
            $ci->load->model('grupos/grupos_model', '', TRUE);
            foreach ($explode_grupos as $v) {
                $b_consulta = $ci->grupos_model->lista_grupos(array(' AND id_grupos = ' => '"' . $v . '"'));
                if ($b_consulta == null) {
                    $conta_erro++;
                }
            }
        }

        if ($conta_erro > 0) {
            return FALSE;
        } else {
            return TRUE;
        }
    }

}